package com.zfast.forge.qlExpress;

import com.zfast.forge.navigation.Coordinate;
import com.zfast.forge.pojo.CustomBigDecimal;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.math3.analysis.UnivariateFunction;
import org.apache.commons.math3.analysis.solvers.BrentSolver;
import org.apache.commons.math3.analysis.solvers.UnivariateSolver;
import org.apache.commons.math3.exception.NoBracketingException;

import java.math.BigDecimal;

/**
 * math3计算
 *
 * @author zgn
 * @Description: QLExpressUtil
 * @date 2024/2/29 0029
 */
@Slf4j
public class Math3Util {
    /**
     * 竖直上抛运动公式
     *
     * @param h 初始高度
     * @param v 速度
     * @param g 重力加速度(cm/ms)
     * @return java.math.BigDecimal
     * @author zgn
     * @date 2024/3/8 0008
     */
    public static BigDecimal verticalThrowMotion(double h, double v, double g) {
        UnivariateFunction function = t ->
                h + v * t + g * Math.pow(t, 2) / 2;

        // 使用Brent方法求解方程根
        UnivariateSolver solver = new BrentSolver();
        double root = 0; // 选择合适的起始区间
        try {
            root = solver.solve(100, function, 0, 1e7);
        } catch (NoBracketingException exception) {
            log.warn("竖直上抛运动公式无解");
        }
        return CustomBigDecimal.valueOf(root);

    }

    /**
     * 追击相遇,返回负数无解
     * @author  zgn
     * @date    2024/3/8 0008
     * @param	ballStart 球初始位置
     * @param	velocity 球速度
     * @param	acceleration 球加速度
     * @param	instanceStart 人的位置
     * @param	v 人的速度
     * @return	java.math.BigDecimal
     */
    public static BigDecimal pursuitMeeting(Coordinate ballStart, Coordinate velocity,Coordinate acceleration,Coordinate instanceStart,double v) {
        //球初始位置
        double a = ballStart.x.doubleValue();
        double b = ballStart.y.doubleValue();
        double c = ballStart.z.doubleValue();

        //球速度
        double d = velocity.x.doubleValue();
        double e = velocity.y.doubleValue();
        double f = velocity.z.doubleValue();

        //球加速度
        double o = acceleration.x.doubleValue();
        double p = acceleration.y.doubleValue();
        double q = acceleration.z.doubleValue();

        //人的位置
        double x = instanceStart.x.doubleValue();
        double y = instanceStart.y.doubleValue();
        double z = instanceStart.z.doubleValue();

        UnivariateFunction function = t -> (
                Math.pow((a + d * t + Math.pow(o, 2) / 2 - x), 2) +
                Math.pow((b + e * t + Math.pow(p, 2) / 2 - y), 2) +
                Math.pow((c + f * t + Math.pow(q, 2) / 2 - z), 2) -
                Math.pow(v * t, 2)
        );

        // 使用Brent方法求解方程根
        UnivariateSolver solver = new BrentSolver();
        double root = 0; // 选择合适的起始区间
        try {
            root = solver.solve(100, function, 1, 1e9);
        } catch (NoBracketingException exception) {
            log.warn("追击相遇无解");
            return new BigDecimal(-1);
        }

        return CustomBigDecimal.valueOf(root);

    }
}
